package com.wang.springframework.beans.factory.config;

import com.wang.springframework.beans.BeansException;
import com.wang.springframework.beans.PropertyValues;

/**
 * @author wangjianhua
 * @Description {@link BeanPostProcessor}的子接口，
 * 它在实例化之前添加回调，在实例化之后但在设置显式属性或发生自动连接之前添加回调。
 * @date 2021/9/3/003 14:30
 **/
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

    /**
     * 在bean对象初始化之前执行此方法
     * @return 可能会返回代理后的bean
     * @param beanClass bean class
     * @param beanName  bean 名称
     * @throws BeansException 异常
     */
    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;



    /**
     * 在bean对象初始化之后执行此方法
     * @return boolean
     * @param bean bean
     * @param beanName  bean 名称
     * @throws BeansException 异常
     */
     boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;



    /**
     * 在bean 对象实例化完成后,设置属性操作之前执行此方法
     * @param pvs PropertyValues
     * @param bean bean
     * @param beanName beanName
     * @return PropertyValues
     * @throws BeansException
     */
    PropertyValues postProcessPropertyValues(PropertyValues pvs, Object bean, String beanName) throws BeansException;

    /**
     * 三级工厂的beanFactory的getObject 实际执行的是该方法 如果对象需要代理 则提前生成代理对象
     * 在 Spring 中由 SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法提供
     * @param bean bean
     * @param beanName beanName
     * @return bean
     */
    default Object getEarlyBeanReference(Object bean,String beanName){
        return bean;
    }
}
